package dbutilyouhua;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.PreparedStatement;

/**
 * 
 * 初步优化DButil,用c3p0来获得Connection对象
 */

public class DButil {
	/**
	 * 优化获得Connection对象的操作aaaaaaaaaa
	 */
	static ComboPooledDataSource datasource = new ComboPooledDataSource();

	public static Connection getConnection() {
		try {
			return datasource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * 关流的操作
	 * 
	 */
	public static void close(Connection conn, Statement sta, ResultSet res) {
		try {
			if (conn != null) {
				conn.close();
			}
			if (sta != null) {
				sta.close();
			}
			if (res != null) {
				res.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * 增删改的操作,这里需要传进来两个参数,一个sql语句占位符的内容,用Object数组的形式,还有就是sql语句本身,用String就好了
	 */

	public static int update(String sql, Object[] param) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		// 获得Connection对象
		try {
			// 获得运输器
			conn = DButil.getConnection();
			pstmt = conn.prepareStatement(sql);
			// insert into stu (panme,pwd) values (?,?);
			// 判断传递进来的参数个数与sql里面的占位符个数是否一致
			if (param != null && param.length > 0) {
				// 用元数据来获得sql语句里面的占位符的个数再与param的长度相比较
				// 获得参数的元数据对象
				ParameterMetaData parameterMetaData = pstmt.getParameterMetaData();
				// 这里判断此占位符是否个数已经足够了
				if (parameterMetaData.getParameterCount() != param.length) {
					throw new RuntimeException("传递参数个数不对!");
				}
				// 没出问题的话,就可以设置占位符了
				for (int i = 0; i < param.length; i++) {
					pstmt.setObject(i + 1, param[i]);
				}
			}
			// 然后就可以执行
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			DButil.close(conn, pstmt, null);
		}

	}
}
